[新機能] Amazon Redshift スキーマにストレージスペースのクォータが指定できるようになったので試してみました

[新機能] Amazon Redshift スキーマにストレージスペースのクォータが指定できるようになったので試してみました

Clock Icon2020.04.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の石川です。クラスタバージョン1.0.14677からスキーマにストレージスペースのクォータが指定できるようになりました。AWSの大薗さんがヒントをくれたので試してみました。

Redshiftでスキーマ毎に容量制限を設定できるようになりましたよ。ユーザーごとにスキーマを開放しているけど容量無制限でオブジェクトを作らせたくない、といった要件に対応できます。地味に嬉しい機能だと思います!https://t.co/YTgiwHUqK1

— Junpei Ozono (@jostandard) April 21, 2020

クォータの設定

スキーマを作成する際にストレージスペースのクォータを指定します。

CREATE SCHEMA [ IF NOT EXISTS ] schema_name [ AUTHORIZATION username ]
[ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] [ schema_element [ ... ]

例えば、50GB割り当てる場合は以下のとおりです。

create schema us_sales authorization dwuser QUOTA 50 GB;

上記のスキーマの100GB割り当てに変更することも可能です。既存のテーブルに対してもクオータを設定、変更できます。

ALTER SCHEMA us_sales QUOTA 100 GB;

クオータに指定できるサイズは、2GB以上100TB以内です。

# ALTER SCHEMA qtest QUOTA 1 MB;
ERROR: Schema quota must be between 2048 and 104857600 MB

クォータを試してみる

まずは、クォータが設定されていない普通のスキーマを作成します。

cm-redshiftdb=# CREATE SCHEMA qtest AUTHORIZATION cm_ishikawa_satoru;
CREATE SCHEMA

cm-redshiftdb=# SET search_path to 'qtest';
SET

上記のスキーマは、5GB割り当てに変更します。

cm-redshiftdb=# ALTER SCHEMA qtest QUOTA 5 GB;
ALTER SCHEMA

qtestスキーマの中にlineorderテーブルを作成します。

cm-redshiftdb=# CREATE TABLE IF NOT EXISTS "qtest"."lineorder"
cm-redshiftdb-# (
cm-redshiftdb(# "lo_orderkey" INTEGER NOT NULL ENCODE az64
cm-redshiftdb(# ,"lo_linenumber" INTEGER NOT NULL ENCODE delta
cm-redshiftdb(# ,"lo_custkey" INTEGER NOT NULL ENCODE az64
cm-redshiftdb(# ,"lo_partkey" INTEGER NOT NULL ENCODE az64
cm-redshiftdb(# ,"lo_suppkey" INTEGER NOT NULL ENCODE az64
cm-redshiftdb(# ,"lo_orderdate" INTEGER NOT NULL ENCODE lzo
cm-redshiftdb(# ,"lo_orderpriority" VARCHAR(15) NOT NULL ENCODE bytedict
cm-redshiftdb(# ,"lo_shippriority" VARCHAR(1) NOT NULL ENCODE runlength
cm-redshiftdb(# ,"lo_quantity" INTEGER NOT NULL ENCODE delta
cm-redshiftdb(# ,"lo_extendedprice" INTEGER NOT NULL ENCODE lzo
cm-redshiftdb(# ,"lo_ordertotalprice" INTEGER NOT NULL ENCODE lzo
cm-redshiftdb(# ,"lo_discount" INTEGER NOT NULL ENCODE delta
cm-redshiftdb(# ,"lo_revenue" INTEGER NOT NULL ENCODE lzo
cm-redshiftdb(# ,"lo_supplycost" INTEGER NOT NULL ENCODE delta32k
cm-redshiftdb(# ,"lo_tax" INTEGER NOT NULL ENCODE delta
cm-redshiftdb(# ,"lo_commitdate" INTEGER NOT NULL ENCODE delta
cm-redshiftdb(# ,"lo_shipmode" VARCHAR(10) NOT NULL ENCODE bytedict
cm-redshiftdb(# )
cm-redshiftdb-# DISTSTYLE KEY
cm-redshiftdb-# DISTKEY ("lo_partkey")
cm-redshiftdb-# SORTKEY (
cm-redshiftdb(# "lo_orderdate"
cm-redshiftdb(# )
cm-redshiftdb-# ;
CREATE TABLE

上記のlineorderテーブルに約7.3GBのlineorder_sampleテーブルのデータをコピーします。しかし、クオータの5GBに達したため、データをコピーが中断します。

cm-redshiftdb=# SELECT size FROM svv_table_info WHERE "table" = 'lineorder_sample';
size
------
7351
(1 row)

cm-redshiftdb=# INSERT INTO "qtest"."lineorder" SELECT * FROM "cm_ishikawa_satoru"."lineorder_sample";
ERROR: Transaction 46821091 is aborted due to exceeding the disk space quota in schema(s): (Schema: qtest, Quota: 5120, Current Disk Usage: 7351).
Free up disk space or request increased quota for the schema(s).

クオータの10GBに変更して、データのコピーを試みると成功します。

cm-redshiftdb=# ALTER SCHEMA qtest QUOTA 10 GB;
ALTER SCHEMA

cm-redshiftdb=# INSERT INTO "qtest"."lineorder" SELECT * FROM "cm_ishikawa_satoru"."lineorder_sample";
INSERT 0 182256332

すでにスキーマ内に7.3GBのデータがある状態で、クオータを5GBに設定してもエラーになりません。しかし、データを追加やテーブルを作成しようとするとエラーになります。

cm-redshiftdb=# ALTER SCHEMA qtest QUOTA 5 GB;
ALTER SCHEMA

cm-redshiftdb=# CREATE TABLE testtab(id int);
ERROR: Transaction 46821572 is aborted due to exceeding the disk space quota in schema(s): (Schema: qtest, Quota: 5120, Current Disk Usage: 7351).
Free up disk space or request increased quota for the schema(s).

最後に

複数の利用者がRedshiftを利用できるように、ユーザーごとにスキーマを作成して公開するときなど、スキーマごとにディスク容量を制限したい場合があります。まさに弊社内でも同じような状況なので、クオータを設定したいと考え始めています。「地味に嬉しい機能」、同感です。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.